package org.andolphin.client.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.util.Log;

public final class DateUtils {

    public static final String TAG = StringUtils.class.getName();

    public static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
    public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");

    /**
     * 时间比较, 比较到日
     * 
     * @param date1 时间1
     * @param date2 时间2
     * @return 0表示相同, 正数是date1 > date2, 负数是date1 < date2
     */
    public static int compareToDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return 0;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(date1).compareTo(sdf.format(date2));
    }

    /**
     * 时间比较, 比较到秒
     * 
     * @param date1 时间1
     * @param date2 时间2
     * @return 0表示相同, 正数是date1 > date2, 负数是date1 < date2
     */
    public static int compareToSecond(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return 0;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(date1).compareTo(sdf.format(date2));
    }

    /**
     * 取得所给的日期的日开始时间(00:00:00,000)
     * 
     * @param day 要转换的日期
     * @return 日开始时间
     */
    public static Date getStartDateOfDay(Date day) {
        if (day == null) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(day);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        return cal.getTime();
    }

    /**
     * 取得所给的日期的日结束时间(23:59:59,000)
     * 
     * @param day 要转换的日期
     * @return 日结束时间
     */
    public static Date getEndDateOfDay(Date day) {
        if (day == null) {
            return null;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(day);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        return cal.getTime();
    }

    /**
     * 取得所给的日期的月开始时间(00:00:00,000)
     * 
     * @param day 要转换的日期
     * @return 月开始时间
     */
    public static Date getStartDateOfMonth(Date day) {
        if (day == null) {
            return null;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(day);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
    }

    /**
     * 取得所给的日期的月结束时间(23:59:59,000)
     * 
     * @param day 要转换的日期
     * @return 月结束时间
     */
    public static Date getEndDateOfMonth(Date day) {
        if (day == null) {
            return null;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(day);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.add(Calendar.MONTH, 1);
        cal.add(Calendar.DAY_OF_MONTH, -1);
        return cal.getTime();
    }

    /**
     * 取得所给的日期的年开始时间(00:00:00,000)
     * 
     * @param day 要转换的日期
     * @return 年开始时间
     */
    public static Date getStartDateOfYear(Date day) {
        if (day == null) {
            return null;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(day);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.MONTH, 0);
        return cal.getTime();
    }

    /**
     * 取得所给的日期的年结束时间(23:59:59,000)
     * 
     * @param day 要转换的日期
     * @return 年结束时间
     */
    public static Date getEndDateOfYear(Date day) {
        if (day == null) {
            return null;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(day);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.MONTH, 0);
        cal.add(Calendar.YEAR, 1);
        cal.add(Calendar.DAY_OF_YEAR, -1);
        return cal.getTime();
    }

    /**
     * 根据年月日创建的日期
     * 
     * @param year 年 如2006年为2006
     * @param month 月 如12月为 11
     * @param day 日 如15日为15
     * @return 日期
     */
    public static Date getDate(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /**
     * 根据年月日创建的日期
     * 
     * @param year 年 如2006年为2006
     * @param month 月 如12月为 11
     * @param day 日 如15日为15
     * @param hour 小时 24时格式 如下午2点为 14
     * @param minute 分钟 如25分为25
     * @param second 秒 如30秒位30
     * @return 日期
     */
    public static Date getDate(int year, int month, int day, int hour, int minute, int second) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.HOUR_OF_DAY, hour);
        cal.set(Calendar.MINUTE, minute);
        cal.set(Calendar.SECOND, second);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /**
     * 取得年数字
     * 
     * @param date 日期
     * @return 年数字
     */
    public static int getYear(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.YEAR);
    }

    /**
     * 取得月数字,一月为 0
     * 
     * @param date 日期
     * @return 月数字
     */
    public static int getMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.MONTH);
    }

    /**
     * 取得日数字
     * 
     * @param date 日期
     * @return 日数字
     */
    public static int getDay(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 计算开始日期和结束日期中间相差几个月
     * 
     * @param start 开始日期
     * @param end 结束日期
     * @return 相差几个月
     */
    public static int calculateMonthDistance(Date start, Date end) {
        int year1 = DateUtils.getYear(start);
        int year2 = DateUtils.getYear(end);
        int month1 = DateUtils.getMonth(start);
        int month2 = DateUtils.getMonth(end);
        return 12 * (year1 - year2) + (month1 - month2);
    }

    /**
     * 计算开始日期和结束日期中间相差多少天
     * 
     * @param start 开始日期
     * @param end 结束日期
     * @return 相差多少天
     */
    public static int calculateDayDistance(Date start, Date end) {
        long startTimeInMillis = start.getTime();
        long endTimeInMillis = end.getTime();
        return (int) ((startTimeInMillis - endTimeInMillis) / (1000 * 60 * 60 * 24));
    }

    /**
     * 得到现在的时间
     * 
     * @return Date
     */
    public static Date now() {
        return Calendar.getInstance().getTime();
    }

    /**
     * 得到现在的时间, 以秒的形式
     * 
     * @return long
     */
    public static long nowInMillis() {
        return Calendar.getInstance().getTimeInMillis();
    }

    /**
     * 从字符串类型转换为Date类型
     * 
     * @param source 要转换的字符串
     * @param pattern 转换模式
     * @see java.text.SimpleDateFormat
     * @return 转换后的时间
     * @throws ParseException 解析出错
     */
    public static Date fromString(String source, String pattern) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.parse(source);
    }

    public static Date parseDateTime(String dateStr) {
        try {
            return DATE_TIME_FORMAT.parse(dateStr);
        } catch (ParseException e) {
            Log.d(TAG, StringUtils.digMessage(e), e);
            return null;
        }
    }

    public static Date parseDate(String dateStr) {
        try {
            return DATE_FORMAT.parse(dateStr);
        } catch (ParseException e) {
            Log.d(TAG, StringUtils.digMessage(e), e);
            return null;
        }
    }

    public static String formatDateTime(Date date) {
        if (date == null) {
            return "";
        } else {
            return DATE_TIME_FORMAT.format(date);
        }
    }

    public static String formatDate(Date date) {
        if (date == null) {
            return "";
        } else {
            return DATE_FORMAT.format(date);
        }
    }

    /**
     * 在传入的日期上加上指定天数
     * 
     * @param date 原始日期
     * @param i 天数
     * @return 加算后的日期
     */
    public static Date addDay(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_YEAR, i);
        return cal.getTime();
    }

    /**
     * 在传入的日期上加上指定月
     * 
     * @param date 原始日期
     * @param i 月
     * @return 加算后的日期
     */
    public static Date addMonth(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, i);
        return cal.getTime();
    }

    /**
     * 在传入的日期上加上指定年
     * 
     * @param date 原始日期
     * @param i 年
     * @return 加算后的日期
     */
    public static Date addYear(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.YEAR, i);
        return cal.getTime();
    }
}
